
\chapter{Introdução}
\label{cap:Introducao}

	\section{Motivação}
	\label{introducao:motivacao} 
	\section{Objetivos}
	\label{introducao:objetivos} 
	\section{Metodologia}
	\label{introducao:metodologia} 
	\section{Estrutura do Trabalho}
	\label{introducao:estrutura_do_trabalho} 


\chapter{Fundamentação Teórica}
\label{cap:fundamentacao}

	\section{Engenharia de Software}
	\label{fundamentacao:eng_soft} 
		\subsection{Metodologia de Desenvolvimento de Software}
	
	\section{Tecnologias}
	\label{fundamentacao:tecnologias} 
	
Este capítulo se dedica a mostrar uma visão geral das tecnologias escolhidas
para o desenvolvimento do sistema. É importante lembrar, que cada tecnologia escolhida
leva em consideração os requisitos funcionais e não funcionais apresentados pelo
cliente, sendo adotada aquelas que se enquadram mais apropriadamente no
contexto apresentado.
	
		\subsection{\jsfextended}

De acordo com Geary e Horstmann \cite{corejsf}, o JSF pode ser concebido como
\textit{'O Swing para aplicações server-side'}. De fato, a proposta do
framework é aproximar o modelo de desenvolvimento de interfaces web do modelo de
desenvolvimento orientado a eventos das interfaces desktop. O \jsf \ promete
facilitar e prover agilidade ao desenvolvimento de interfaces \textit{web}
do lado do servidor, ficando o desenvolvedor encarregado de pensar e programar
um pouco mais alto nível em relação ao modelo proposto pelo JSP e Servlets.

Alguns dos principais serviços do JSF são:
\begin{itemize}
	\item \textbf{Arquitetura MVC (\textit{model-view-controller})}
	- Padrão arquitetural que tem por objetivo desacoplar lógica de negócio de sua
	camada de apresentação. Este desacoplamento benificia a manutenção dos
	componentes do sistema. \textit{Model}, ou Modelo, significa representa o
	domínio da informação, representam os dados. O \textit{View}, ou Visão,
	apresenta os dados do \textit{Model} para o usuário em um formato adequado.
	\textit{Controller}, ou controlador, é o responsável pela passagem de dados
	entre \textit{View} e \textit{Model}.
	\item \textbf{Validação e manipulação de erros}
	- O JSF fornece componentes que facilitam a validação dos dados fornecidos
	pelo usuário através de um formulário e viabilizam a apresentação das
	informações destes erros de volta ao usuário.
	\item \textbf{Conversão de dados}
	- Dados que são fornecidos pelo usuário são sempre \textit{strings},
	entretanto, no paradigma de Programação Orientada a Objetos, estes dados devem
	ser convertidos para objetos bem definidos ao serem recebidos no servidor. O
	JSF fornece componentes prontos para converter os principais tipos de dados,
	como por exemplo datas.
	\item \textbf{Internacionalização}
	- A necessidade de apresentar o sistema em vários idiomas, dependendo do idioma
	do navegador do usuário ou até mesmo o idioma que ele deseja visualizar, é uma
	funcionalidade facilitada pelo JSF. Através de arquivos de configuração
	chamados ``arquivos \textit{properties}'' ou ``arquivos de propriedades'', que
	são arquivos de texto simples com ``\textbf{chaves}'' e ``\textbf{valores}''
	separados por dois pontos (:), o JSF atua substituindo os textos representados
	pelas chaves, através de EL (discutiremos sobre as EL posteriormente neste
	capítulo), por seus respectivos valores no arquivo de propriedade adequado para
	o idioma identificado. Por padrão, o JSF identifica o idioma adequado como o
	idioma do navegador do usuário.
	
	\item \textbf{Componentes customizados}
	- O JSF contém um conjunto de componentes pré fabricados para interface
	gráfica, validação e conversão dos dados, dentre outros. Entretanto,
	eventualmente os componentes fornecidos pelo \textit{framework} não são
	suficientes para satisfazer as necessidades do programador, por isto o
	\textit{Java Server Faces} fornece a possibilidade de extender os seus
	componentes componentes, ou até mesmo criar um novo.
\end{itemize}

A partir do momento em que o programador JSF passa a entender e aplicar o novo
modelo de desenvolvimento proposto pelo framework, ele passa a abstraír uma
série de características do JSP e Servlets. Entretanto em sua arquitetura
interna, o JSF não abandonou o JSP e nem mesmo os Servlets, ele apenas encapsula
o desenvolvimento dos mesmos em seus componentes. Prova disto é que, ao
configurar o \textit{framework}, temos que declarar o \textit{servlet}
responsável por responder todas as requisições JSF, o \textit{FacesServlet}.

As configurações no JSF são baseadas em XML, embora haja um forte movimento para
a mudança destas para utilizar as \textit{Java Annotations}
\cite{javaAnotations}. Dentre as configurações, cabe destacar o
\textbf{mapeamento dos \textit{controllers} (\textit{Managed Beans})} para serem utilizados em suas
páginas JSF e as \textbf{regras de navegação} orientadas ao retorno de strings do
\textit{controller}. Estas são as configurações mais utilizadas durante o
desenvolvimento, embora não sejam as únicas necessárias.

Para utilizar um componente JSF, faz-se uso de pacotes de \textit{tags} XML
que devem ser declaradas no ínicio da página, conforme a Figura
\ref{fig:exemplo02}. A partir de então, pode-se utilizar as \textit{tags}
contidas no pacotes declarados, estes são chamdos \textit{Tag Libraries}. O
pacote de prefixo ``f'' na figura é chamado de \textit{tags core} do JSF, que
contém componentes que não são resultantes em código de \textit{view} HTML. O
pacote de prefixo ``h'' são componentes que são traduzidos em código de
\textit{view} HTML. Os prefixos podem ser customizados, entretanto, isto vai
interferir na forma de uso das \textit{tags} no documento, como está
exemplificado nas figuras \ref{fig:exemplo02} \ e \ref{fig:exemplo03}. As linhas
3 e 4 mostram as alterações dos prefíxos a serem utilizados nas \textit{tags} do
documento, a linha 14 exemplifica a mudança de uso causada por estas
modificações.

	\begin{figure}[h!]
	 	\centering
	 	\fbox{
			\includegraphics[width=1.0\textwidth]{images/exemplo02.png}
		} 
		\caption{
			Exemplo de utilização de tags com prefíxo ``h''.
		}
		\label{fig:exemplo02}
	\end{figure} 
	
	\begin{figure}[h!]
	\centering 
	\fbox{
		\includegraphics[width=1.0\textwidth]{images/exemplo03.png}
	}
	\caption{
		Exemplo de utilização de tags com prefíxo ``html''.}
	\label{fig:exemplo03}
	\end{figure} 

As \textit{tags} JSF são compostas dos mesmos fundamentos do XML, portanto cada
uma pode ter um conjunto de atributos. Cada atributo será interpretado de
uma forma específica dentro do seu componente, mas é importante dizer que eles recebem
valores \textit{string}, todos eles. É possível passar valores de acordo com o
código Java presente no \textit{controller}. Imagine que, por exemplo, exista no
\textit{controller} uma variável \textit{string} chamada 'nomeAluno', para que este valor seja exportado para um componente JSF, utiliza-se a EL (\textit{Expression Lenguage}). Cada \textit{expression
language} pode conter operações aritiméticas, comparações, acessar métodos, dentre outras características.
A Apache é a principal mantenedora da EL \cite{apacheEl}.

Na figura \ref{fig:exemplo04} temos um exemplo de uso de uma EL para acessar o
atributo ``nomeAluno''. Perceba que a chamada de método \textit{get} na figura
omite parte da assinatua ficando apenas \textit{mg.nomeAluno}, ao invés de
\textit{mg.getNomeAluno()}. Os atributos são acessados no arquivo
de \textit{view} através dos métodos \textit{get}, \textit{is} (quando \textit{boolean})
e \textit{set}, esta utilização de componentes JSF e EL mantém uma separação
entre \textit{view} e \textit{controller}.

\begin{figure}[h!]
	\centering 
	\fbox{
		\includegraphics[width=0.5\textwidth]{images/exemplo04.png}
	}
	\caption{
		Exemplo de utilização de uma EL.
	}
	\label{fig:exemplo04}
	\end{figure} 

O \textit{Controller}, no JSF, é conhecido como \textit{\textbf{Managed Beans}}.
Estes são objetos Java que são mapeados e utilizados no JSF dispondo atributos
e métodos para o mesmo. Na figura \ref{fig:exemplo04}, existe uma classe Java que
foi mapeada com o nome 'mb' e dispoõe do método 'getNomeAluno'.

Segundo \cite{corejsf}, o JSF é composto das seguintes partes:
\begin{itemize}
	\item \textbf{Um conjunto de componentes pré-fabricados de UI (interface de
	usuário)}
	- Estes componentes variam desde estruturas  simples que representam HTML
	básico, como botões e \textit{inputs}, até tabelas e listas compostas resultantes de
	iterações de dados e com eventos JavaScript anexado a estes.
	O JSF é responsável por abstrair a iteração de linhas
	de tabelas, a atribuição de valores na \textit{view} com os valores dos objetos
	no \textit{controller}, dentre outros.
	
	\item \textbf{Um modelo de programação orientado a eventos}
	- O JSF fica responsável por manipular o código JavaScript que direciona os
	eventos de página para a lógica de negócio, desta forma não preocupa-se em
	criar um mapeamento de \textit{servlet} para chamar uma ação, o programador
	preocupa-se apenas com a lógia e utiliza a estrutura do JSF baseada em
	\textit{Tag Libraries} que faz a ligação dos eventos direto
	com um método no servidor, daí a comparação com o \textit{Swing}. Na Figura
	\ref{fig:exemplo1} o atributo \textit{action} faz a ligação do evento de
	clique do botão para o método excluir do objeto mapeado com nome \textit{bean}.
	 
	\begin{figure}[h!]
	\centering 
	\fbox{
		\includegraphics[width=0.6\textwidth]{images/exemplo01.jpg}
	}
	\caption{
		Exemplo de tag JSF com ligação de método no atributo \textit{action}.
	 }
	\label{fig:exemplo1}
	\end{figure} 
	
	\item \textbf{Um modelo de componentes que permite a desenvolvedores
	independentes fornecerem componentes adicionais}	
	- O JSF permite a implementação de componentes customizados, isto fez com que
	empresas como a JBoss (projeto \textit{RichFaces}), Apache (projeto
	\textit{MyFaces Tomahawk}) fornecem componentes
	ricos de interface gráfica, prontos para uso.
\end{itemize} 

	Assim como temos várias empresas desenvolvendo componentes JSF, temos também
	várias implementações do mesmo provenientes destas empresas. Isto se dá ao fato
	de \jsf \ ser uma especificação JCP \cite{jcpDoc}. Estas implementações podem
	ser adaptadas a qualquer servidor de aplicação JEE, ou até mesmo em um servidor web JSE como o Apache Tomcat. Os servidores de
	aplicação JEE já estão preparados com uma implementação JSF específica, podendo
	ser alterada. O servidor JSE pode vir configurado com alguma implementação JSF,
	mas no Apache Tomcat, objeto de estudo em capítulos posteriores, é necessário
	adicionar a sua implementação JSF desejada.


		
		
		\subsection{Facelets}
		\subsection{\jpa}
		\subsection{\jaasextended}
		\subsection{\mysql}
		\subsection{Outras tecnologias: HTML, CSS, JavaScript, jQuery, PDFKit,
		iReports}
		\subsection{Servidor de Páginas WEB: Apache Tomcat}

\chapter{Descrição do Sistema}
\label{cap:desc_sistema}
	\section{O Problema}
	
	Chama-se de \textbf{Instrumento de Conclusão de Curso} os trabalhos
	obrigatórios para atestado de conhecimento dos alunos dos cursos de todas as
	áreas e níveis. Estes trabalhos devem ser acompanhados por um professor
	orientador. Cada professor deve ficar responsável por orientar um grupo de
	alunos, levando em consideração as horas designadas para o trabalho de
	orientação.
	
	Trata-se do problema, a desorganização e dificuldade de controle das horas
	de orientação de cada professor, bem como a falta de informações
	suficientes de apoio à distribuição de carga horária e de alunos para orientação.
	
	
	\section{O Contexto}
	
	O IFRN - Instituto Federal de Educação, Ciência e Tecnologia do Rio Grande do Norte,
	cliente deste projeto, é dívidido em diretorias, cada diretoria é
	específica de de uma \textbf{área de ensino} e fornece diversos cursos dentro
	de cada área. Cada \textbf{diretoria} é representada por um \textbf{diretor}, e
	cada \textbf{curso} é representado por um \textbf{coordenador}. Tanto o
	coordenador como o diretor são professores que atuam nesta função.
	
	O Instrumeto de Conclusão, conforme dito anteriormente, é obrigatório para a
	conclusão de qualquer curso e, atualmente, não há um controle efetivo de
	orientações, ou seja, não se sabe qual professor está orientando qual aluno,
	qual aluno está sem orientador, tampouco quantas horas este professor dispende
	em orientações.
	
	O Contexto atual não há um Sistema de Informação
	que controle estes dados, faz com que a informação seja perdida
	ou subutilizada.

	\section{A Solução}
	
	Como foi dito anteriormente, a necessidade de um Sistema de Informação  que
	controle os dados referentes à orientação dos Intrumentos de Conclusão de Curso
	fez com que surgisse a idéia do \textbf{CICC - Controle de Intrumentos de
	Conclusão de Curso}. 
	
	A proposta é criar um sistema web, onde as funcionalidades do mesmo sejam
	compartilhadas entre as diretorias, respeitando a idéia de escopo e autonomia
	de cada uma destas diretorias.
	
	O escopo do sistema será abordado em seções posteriores, onde serão
	apresentados os \textbf{requisítos funcionais e não funcionais} e a lista de
	casos de uso levantados bem  como o detalhamento de cada um destes.
	
	\subsection{Requisitos Funcionais}
		
		Requisitos Funcionais explicitam as funcionalidades que o
		sistema deve disponibilizar e representam a expectativa do cliente para que o
		sistema atenda às suas necessidades.
		
		A Tabela \ref{tab:requisitosfuncionais} enumera a Lista Requisitos Funcionais
		do sistema. A numeração da referência não é uma prioridade de implementação e nem de importancia.
		
	\begin{table}[htp]\centering	
	    \begin{tabular}{ | l | l | l | l |}
	    \hline
		    Referência & Nome & Descrição & Relevância\\ 
		\hline
		   	RF01 
		   &
		   	Cadastro de Tipos de Instrumento de Conclusão
		   &
		   	Cadastro de manutenção dos Tipos de Instrumento de Conclusão
		   &
		   	Média
		   \\
	    \hline
				RF02	
	    	&
	    		Cadastro de Diretorias
	    	&
				Cadastro de manutenção de Diretorias
			&
				Média 
	    	\\   
	    \hline
				RF03 
	    	&
	    		Cadastro de Cursos
	    	&
				Cadastro de manutenção de Cursos
			&
				Alta
	    	\\   
	    \hline
	 			RF04
	    	&
	    		Cadastro de Empresas
	    	&
				Cadastro de manutenção de Empresas
			&
				Baixa
	    	\\   
	    \hline
	 			RF05
	    	&
	    		Cadastro de Usuários
	    	&
				Cadastro de manutenção de Usuários
			&
				Alta
	    	\\   
	    \hline
	 			RF06
	    	&
	    		Cadastro de Área de Atuação
	    	&
				Cadastro de manutenção de Áreas de Atuação
			&
				Média
	    	\\   
	    \hline
	 			RF07
	    	&
	    		Cadastro de Alunos
	    	&
				Cadastro de manutenção de Alunos
			&
				Alta
	    	\\   
	    \hline
	 			RF08
	    	&
	    		Cadastro de Instrumentos de Conclusão
	    	&
				Cadastro de manutenção de Instrumentos de Conclusão
			&
				Alta
	    	\\   
	    \hline
	 			RF09
	    	&
	    		Envio de Mensagens
	    	&
				Envio de mensagens a partir do sistema
			&
				Alta
	    	\\   
	    \hline
	 			RF10
	    	&
	    		Banco de Vagas
	    	&
				Informar a disponibilidade de horas para orientação de cada professor
			&
				Alta
	    	\\   
	    \hline
	 			RF11
	    	&
	    		Orientar Alunos
	    	&
				Cadastro de mensagens de orientação aos alunos e upload do documento final do
				trabalho
			&
				Alta
	    	\\   
	    \hline
	 			RF12
	    	&
	    		Importar Dados
	    	&
				Importação de dados de um CSV para os cadastros de grande volume de dados
			&
				Média
	    	\\   
	    \hline
	 			RF13
	    	&
	    		Relatórios
	    	&
				Fornecer interface de extração de dados em relatórios pdf
			&
				Alta
	    	\\   
	    \hline
	 			RF14
	    	&
	    		Autenticação
	    	&
				Fornecer dados privados e seguros sob autenticação
			&
				Alta
	    	\\   
	    \hline
	    \end{tabular}
	    \caption{Lista de Requisitos Funcionais} 
	    \label{tab:requisitosfuncionais} 
	\end{table}
		
	\subsection{Requisitos Não Funcionais}

		Requisitos Não Funcionais refletem os aspectos não funcionais do sistema, ou
		seja, que não serão convertidas em funcionalidade. Escalabilidade, segurança,
		plataforma, são exemplos de requisitos não funcionais.
		
		A Tabela \ref{tab:requisitosnaofuncionais} apresenta a lista de Requisitos Não
		Funcionais do sistema. A numeração da referência não é uma prioridade de
		implementação e nem de importancia.
		
		\begin{table}[htp]\centering	
		    \begin{tabular}{ | l | l | l | l |}
		    \hline
			    Referência & Nome & Descrição & Relevância\\ 
			\hline
			   	RNF01 
			   &
			   	Plataforma
			   &
			   	O sistema deverá ser implantado em ambiente web
			   &
			   	Alta
			   \\
			\hline
			   	RNF02 
			   &
			   	Tecnologias
			   &
			   	O conjunto de tecnologias utilizadas deverão estar em concordância com a
			   	ementa do curso de Tecnologia em Análise e Desenvolvimento de Sistemas da
			   	instituição
			   &
			    Alta
			   \\
		    \hline
			\end{tabular}	
			\caption{Lista de Requisitos Não Funcionais} 
		    \label{tab:requisitosnaofuncionais} 
		\end{table}
	
	\subsection{Casos de Uso}
		
		Cada unidade funcional e coerente no sistema é chamada de Caso de Uso. Nesta
		sessão serão apresentados o levantamento dos Casos de Uso e seus detalhamentos.
		
		A Figura \ref{fig:cdus} representa o \textbf{Diagrama de Casos de Uso} do
		sistema.
		
		\begin{figure}[h!]
		\centering 
		\fbox{
			\includegraphics[width=1\textwidth]{images/cdus.jpg}
		}
		\caption{
			Diagrama de Casos de Uso do sistema.
		 }
		\label{fig:cdus}
		\end{figure} 
		

	A Tabela \ref{tab:casosdeuso} lista os Casos de Uso
	levantados com suas breves descrições. Casos de Uso do tipo \textbf{CRUD}
	(\textit{Create, Retrieve, Update, Delete}) serão agrupados em um único caso de
	uso do tipo Manutenção, contendo todas estas funcionalidades.
	
	\begin{table}[htp]\centering	
		\begin{tabular}{ | l | l | l | l |}
	    \hline
		    Referência & Nome & Descrição\\ 
		\hline
		   	CDU01 
		   &
		   	Manter Tipos de Instrumento de Conclusão
		   &
		   	Cadastrar, Listar, Atualizar e Deletar Tipos de Instrumento de Conclusão
		   \\
	    \hline
				CDU02	
	    	&
	    		Manter Diretorias
	    	&
				Cadastrar, Listar, Atualizar e Deletar Diretorias
	    	\\   
	    \hline
				CDU03 
	    	&
	    		Manter Cursos
	    	&
				Cadastrar, Listar, Atualizar e Deletar Cursos
	    	\\   
	    \hline
	 			CDU04
	    	&
	    		Manter Empresas
	    	&
				Cadastrar, Listar, Atualizar e Deletar Empresas
	    	\\   
	    \hline
	 			CDU05
	    	&
	    		Manter Usuários
	    	&
				Cadastrar, Listar, Atualizar e Deletar Usuários
	    	\\   
	    \hline
	 			CDU06
	    	&
	    		Manter Área de Atuação
	    	&
				Cadastrar, Listar, Atualizar e Deletar Áreas de Atuação
	    	\\   
	    \hline
	 			CDU07
	    	&
	    		Manter Alunos
	    	&
				Cadastrar, Listar, Atualizar e Deletar Alunos
	    	\\   
	    \hline
	 			CDU08
	    	&
	    		Manter Instrumentos de Conclusão
	    	&
				Cadastrar, Listar, Atualizar e Deletar Instrumentos de Conclusão
	    	\\   
	    \hline
	 			CDU09
	    	&
	    		Enviar de Mensagem
	    	&
				Enviar mensagens de aviso via e-mail. Estas mensagens podem ser avisos
				automáticos do sistema ou escritas pelo usuário
	    	\\   
	    \hline
	 			CDU10
	    	&
	    		Listar Vagas
	    	&
				Informar a disponibilidade de horas para orientação de cada professor levando
				em consideração a quantidade de Instrumentos de Conclusão abertos no sistema
	    	\\   
	    \hline
	 			CDU11
	    	&
	    		Orientar Aluno
	    	&
				Cadastro de mensagens de orientação aos alunos e upload do documento final do
				trabalho
	    	\\   
	 	\hline
	 			CDU12
	    	&
	    		Concluir Orientação
	    	&
				O usuário adiciona uma orientação para finalizar o Instrumento de Conclusão
	    	\\    
	    \hline
	 			CDU13
	    	&
	    		Importar Alunos
	    	&
				Importação de dados de alunos de um CSV
	    	\\   
	    \hline
	 			CDU14
	    	&
	    		Importar Professores
	    	&
				Importação de dados de professores de um CSV
	    	\\   
	    \hline
	 			CDU15
	    	&
	    		Autenticar
	    	&
				Fornecer credenciais para acessar o sistema
	    	\\   
	    \hline
	 			CDU16
	    	&
	    		Gerenciar dados pessoais
	    	&
				Os usuários podem atualizar seus dados pessoais, tais como senha e áreas de
				atuação
	    	\\   
	    \hline
	 			CDU17
	    	&
	    		Anexar Documento Final
	    	&
				O usuário adiciona um documento final para a conclusão da orientação
	    	\\   
	    \hline
	 			CDU18
	    	&
	    		Gerar Relatórios
	    	&
				Gerar relatórios em pdf
	    	\\   
	    \hline
	    \end{tabular}
		\caption{Lista de Casos de Uso} 
	    \label{tab:casosdeuso} 
	\end{table}	

	\subsection{Modelo de Domínio}
	
		A Figura \ref{fig:dominio} representa o \textbf{Modelo de Domínio} do sistema.
		
		\begin{figure}[h!]
		\centering 
		\fbox{
			\includegraphics[width=1\textwidth]{images/dominio.jpg}
		}
		\caption{
			Modelo de Domínio do sistema.
		 }
		\label{fig:dominio}
		\end{figure} 
	
	\subsection{Arquitetura}
		Falar sobre padrão arquitetural.
		
		Falar sobre MVC.
			
		A Figura \ref{fig:arquitetura} representa o  \textbf{Padrão Arquitetural MVC}
		adotado na implementação do sistema e herdado do modelo de programação JSF.
		
		\begin{figure}[h!]
		\centering 
		\fbox{
			\includegraphics[width=1\textwidth]{images/mvc.jpg}
		}
		\caption{
			Padrão Arquitetural MVC. 
		 }
		\label{fig:arquitetura}
		\end{figure} 
		
	\subsection{Detalhamento dos Casos de Uso} 
	
\chapter{Resultados}
\label{cap:resultados}
